from sklearn.feature_extraction import DictVectorizer
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.preprocessing import MinMaxScaler, StandardScaler,Imputer
from sklearn.feature_selection import VarianceThreshold
from sklearn.decomposition import PCA
import jieba
import numpy as np
import pandas as pd

def dictvec():
    """
    对字典数据进行特征提取
    :return: None
    """
    # 创建字典向量话的对象
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]

    dict_vec = DictVectorizer()

    # 调用fit_transform方法 来转换数据
    data = dict_vec.fit_transform(data)
    print(dict_vec.get_feature_names())
    # 还原数据
    data = dict_vec.inverse_transform(data)
    print(data)
    # 验证数据
    # print(data.toarray())
    return None



def countvec():
    """
    对文档中词出现频率特征进行提取操作
    1. 单个字母单词不会进入词频统计
    :return: None
    """
    # 创建对象
    count_vec = CountVectorizer()
    # 调用fit_transform方法
    data = ["life is short,i like is python", "life is too long,i dislike python"]
    data = count_vec.fit_transform(data)
    print(count_vec.get_feature_names())
    data = count_vec.inverse_transform(data)
    print(data)
    # print(data.toarray())
    # 验证数据

    return None


def cutword():
    """
    通过jieba 分词模块来完成对中文的分词处理
    :return: 
    """
    con1 = jieba.cut("马云说今天很残酷，马云又说明天更残酷，但是后天很美好，马云还说但是绝对大部分是死在明天晚上，所以每个人不要放弃今天。")
    con2 = jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的，这样当我们看到宇宙时，我们是在看它的过去。")
    con3 = jieba.cut("如果只用一种方式了解某样事物，你就不会真正了解它。但是了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。")
    content1 = []
    content2 = []
    content3 = []
    for w in con1:
        content1.append(w)
    for w in con2:
        content2.append(w)
    for w in con3:
        content3.append(w)

    con1 = ' '.join(content1)
    con2 = ' '.join(content2)
    con3 = ' '.join(content3)

    return con1, con2, con3

def tfidfvec():
    """
    tfidf的使用 如果一个词在一篇文档中出现的次数比较多, 但是在其他的文档中出现的次数比较少
    此时这个词的tfidf值就会比较高, 此时这个词的分类能力就会比较好
    tf: term frequency 指的是一个词在某一篇文档中出现的频率
    idf: inverse document frequency 逆文档词频
    tfidf 对于中文的处理不是特别好
    就需要通过一个业界使用非常广泛的jieba库, 对中文做分词处理
    :return: None
    """

    tfidf = TfidfVectorizer(stop_words=["所以"])
    c1, c2, c3= cutword()
    data = tfidf.fit_transform([c1, c2, c3])
    print(tfidf.get_feature_names())
    print(data.toarray())

    return None


def minmax():
    """
    归一化将数据处理到某一个指定的范围
    同等重要的特征数据, 如果某一个数据特别大 有可能会对结果的分析造成的影响比较大,此时就需要将处理的数据重要性平等的对待
    此时需要讲数据进行归一化的处理
    :return: 
    """
    # 创建对象
    min_max = MinMaxScaler(feature_range=(2,5))
    data = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]
    # 转换数据
    data = min_max.fit_transform(data)
    print(data)
    return None


def stand():
    """
    将数据处理成一种比较稳定的正太分布数据
    :return: 
    """
    std = StandardScaler()
    data = [[ 1., -1., 3.],[ 2., 4., 2.],[ 4., 6., -1.]]
    data = std.fit_transform(data)
    print(std.mean_)
    # print(std.std_)
    print(data)
    return None

def imputer():
    """
    缺失值的处理
    axis 默认为0 是通过列的平均值来填充
    :return: None
    """
    im = Imputer(strategy="mean",axis=1)
    data = [[1, 2], [np.nan, 3], [7, 6]]

    data = im.fit_transform(data)
    print(data)

    return None


def van():
    """
    删除低方差的数据
    :return: None
    """
    v = VarianceThreshold()
    data = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]
    data = v.fit_transform(data)
    print(data)

    return None


def pca():
    """
    pca给数据降维 如果没有指定降低维度的数量, 会在原有的维度-1
    :return: None
    """
    p = PCA(n_components=2)
    data = [[0, 2, 0, 3], [0, 1, 4, 3], [0, 1, 1, 3]]

    data = p.fit_transform(data)
    print(data)



def pcaexample():
    """
    通过PCAde方式给用户购买商品类型的偏好进行数据降维
    orders --> order_products_prior  --> products  --> aisles
    :return: None
    """
    orders = pd.read_csv("./data/instacart/orders.csv")
    aisles = pd.read_csv("./data/instacart/aisles.csv")
    order_products_prior = pd.read_csv("./data/instacart/order_products_prior.csv")
    products = pd.read_csv("./data/instacart/products.csv")
    me = pd.merge(orders, order_products_prior, on=['order_id','order_id'])
    me = pd.merge(me, products, on=['product_id', 'product_id'])
    me = pd.merge(me, aisles, on=['aisle_id','aisle_id'])
    # 用户和商品类别的关系
    me = pd.crosstab(me['user_id'],aisles['aisle'])
    #创建pca降维对象
    pca = PCA(n_components=100)
    # fit_transform
    me = pca.fit_transform(me)


    print(me)

    return None
if __name__ == '__main__':
    # dictvec()
    # countvec()
    #tfidfvec()
    # cutword()
    # minmax()
    # stand()
    # imputer()
    # van()
    # pca()
    pcaexample()


# 数值的类型如果是离散型(区间内不可分), 分类问题, 适合通过分类算法来解决这类问题
# 连续型(居间内可分), 小数类型, 回归类的问题, 适合通过回归类的算法类解决
# y = kx + b  y就是预测值 和真实值来比较
# 通过测试数据来评估模型
